From: Jonas Ã…dahl Date: Fri, 22 Nov 2019 17:36:17 +0000 (+0100) Subject: Use paint and pick context to get framebuffer X-Git-Tag: archive/raspbian/50.5-1+rpi1~1^2~781^2^2~343 X-Git-Url: https://dgit.raspbian.org/%22http://www.example.com/cgi/%22/%22http:/www.example.com/cgi/%22?a=commitdiff_plain;h=632a64399417c0dbdf70c96bf0de3d92c74dfc9c;p=gnome-shell.git Use paint and pick context to get framebuffer Mutter and Clutter was changed to pass around the current target framebuffer via the paint context instead of via the deprecated Cogl framebuffer stack. The framebuffer stack has also been removed from Cogl so change to use the one in the paint context instead. https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/827 --- diff --git a/js/ui/lookingGlass.js b/js/ui/lookingGlass.js index 19a9396d4..ac25c7b73 100644 --- a/js/ui/lookingGlass.js +++ b/js/ui/lookingGlass.js @@ -472,25 +472,40 @@ class ObjInspector extends St.ScrollView { var RedBorderEffect = GObject.registerClass( class RedBorderEffect extends Clutter.Effect { + _init() { + super._init(); + this._pipeline = null; + } + vfunc_paint(paintContext) { + let framebuffer = paintContext.get_framebuffer(); + let coglContext = framebuffer.get_context(); let actor = this.get_actor(); actor.continue_paint(paintContext); - let color = new Cogl.Color(); - color.init_from_4ub(0xff, 0, 0, 0xc4); - Cogl.set_source_color(color); + if (!this._pipeline) { + let color = new Cogl.Color(); + color.init_from_4ub(0xff, 0, 0, 0xc4); + + this._pipeline = new Cogl.Pipeline(coglContext); + this._pipeline.set_color(color); + } let alloc = actor.get_allocation_box(); let width = 2; // clockwise order - Cogl.rectangle(0, 0, alloc.get_width(), width); - Cogl.rectangle(alloc.get_width() - width, width, - alloc.get_width(), alloc.get_height()); - Cogl.rectangle(0, alloc.get_height(), - alloc.get_width() - width, alloc.get_height() - width); - Cogl.rectangle(0, alloc.get_height() - width, - width, width); + framebuffer.draw_rectangle(this._pipeline, + 0, 0, alloc.get_width(), width); + framebuffer.draw_rectangle(this._pipeline, + alloc.get_width() - width, width, + alloc.get_width(), alloc.get_height()); + framebuffer.draw_rectangle(this._pipeline, + 0, alloc.get_height(), + alloc.get_width() - width, alloc.get_height() - width); + framebuffer.draw_rectangle(this._pipeline, + 0, alloc.get_height() - width, + width, width); } }); diff --git a/src/shell-glsl-effect.c b/src/shell-glsl-effect.c index 6347dbf9c..8f4bd2aaf 100644 --- a/src/shell-glsl-effect.c +++ b/src/shell-glsl-effect.c @@ -74,6 +74,7 @@ shell_glsl_effect_paint_target (ClutterOffscreenEffect *effect, ShellGLSLEffectPrivate *priv; ClutterActor *actor; guint8 paint_opacity; + CoglFramebuffer *framebuffer; priv = shell_glsl_effect_get_instance_private (self); @@ -85,7 +86,9 @@ shell_glsl_effect_paint_target (ClutterOffscreenEffect *effect, paint_opacity, paint_opacity, paint_opacity); - cogl_framebuffer_draw_rectangle (cogl_get_draw_framebuffer (), + + framebuffer = clutter_paint_context_get_framebuffer (paint_context); + cogl_framebuffer_draw_rectangle (framebuffer, priv->pipeline, 0, 0, priv->tex_width, priv->tex_height); diff --git a/src/shell-invert-lightness-effect.c b/src/shell-invert-lightness-effect.c index 282725b22..bb0e97961 100644 --- a/src/shell-invert-lightness-effect.c +++ b/src/shell-invert-lightness-effect.c @@ -124,7 +124,7 @@ shell_invert_lightness_effect_paint_target (ClutterOffscreenEffect *effect, ShellInvertLightnessEffect *self = SHELL_INVERT_LIGHTNESS_EFFECT (effect); ClutterActor *actor; guint8 paint_opacity; - CoglFramebuffer *fb = cogl_get_draw_framebuffer (); + CoglFramebuffer *fb = clutter_paint_context_get_framebuffer (paint_context); actor = clutter_actor_meta_get_actor (CLUTTER_ACTOR_META (effect)); paint_opacity = clutter_actor_get_paint_opacity (actor); diff --git a/src/st/st-box-layout.c b/src/st/st-box-layout.c index 66b17b185..019aebd76 100644 --- a/src/st/st-box-layout.c +++ b/src/st/st-box-layout.c @@ -397,7 +397,7 @@ st_box_layout_paint (ClutterActor *actor, ClutterActorBox allocation_box; ClutterActorBox content_box; ClutterActor *child; - CoglFramebuffer *fb = cogl_get_draw_framebuffer (); + CoglFramebuffer *fb = clutter_paint_context_get_framebuffer (paint_context); get_border_paint_offsets (self, &x, &y); if (x != 0 || y != 0) @@ -454,7 +454,7 @@ st_box_layout_pick (ClutterActor *actor, ClutterActorBox allocation_box; ClutterActorBox content_box; ClutterActor *child; - CoglFramebuffer *fb = cogl_get_draw_framebuffer (); + CoglFramebuffer *fb = clutter_pick_context_get_framebuffer (pick_context); get_border_paint_offsets (self, &x, &y); if (x != 0 || y != 0) diff --git a/src/st/st-entry.c b/src/st/st-entry.c index 9c45fbd65..cb75273b5 100644 --- a/src/st/st-entry.c +++ b/src/st/st-entry.c @@ -877,11 +877,16 @@ st_entry_paint (ClutterActor *actor, } if (priv->text_shadow_material != NULL) - _st_paint_shadow_with_opacity (shadow_spec, - cogl_get_draw_framebuffer (), - priv->text_shadow_material, - &allocation, - clutter_actor_get_paint_opacity (priv->entry)); + { + CoglFramebuffer *framebuffer = + clutter_paint_context_get_framebuffer (paint_context); + + _st_paint_shadow_with_opacity (shadow_spec, + framebuffer, + priv->text_shadow_material, + &allocation, + clutter_actor_get_paint_opacity (priv->entry)); + } } /* Since we paint the background ourselves, chain to the parent class diff --git a/src/st/st-icon.c b/src/st/st-icon.c index fc6aa5123..133209d1e 100644 --- a/src/st/st-icon.c +++ b/src/st/st-icon.c @@ -178,10 +178,12 @@ st_icon_paint (ClutterActor *actor, if (priv->shadow_pipeline) { ClutterActorBox allocation; + CoglFramebuffer *framebuffer; clutter_actor_get_allocation_box (priv->icon_texture, &allocation); + framebuffer = clutter_paint_context_get_framebuffer (paint_context); _st_paint_shadow_with_opacity (priv->shadow_spec, - cogl_get_draw_framebuffer (), + framebuffer, priv->shadow_pipeline, &allocation, clutter_actor_get_paint_opacity (priv->icon_texture)); diff --git a/src/st/st-label.c b/src/st/st-label.c index 42816ffdf..947c8ec86 100644 --- a/src/st/st-label.c +++ b/src/st/st-label.c @@ -229,11 +229,17 @@ st_label_paint (ClutterActor *actor, } if (priv->text_shadow_pipeline != NULL) - _st_paint_shadow_with_opacity (shadow_spec, - cogl_get_draw_framebuffer (), - priv->text_shadow_pipeline, - &allocation, - clutter_actor_get_paint_opacity (priv->label)); + { + CoglFramebuffer *framebuffer; + + framebuffer = + clutter_paint_context_get_framebuffer (paint_context); + _st_paint_shadow_with_opacity (shadow_spec, + framebuffer, + priv->text_shadow_pipeline, + &allocation, + clutter_actor_get_paint_opacity (priv->label)); + } } } diff --git a/src/st/st-private.c b/src/st/st-private.c index fd2cc39b1..3107a0cf2 100644 --- a/src/st/st-private.c +++ b/src/st/st-private.c @@ -490,12 +490,6 @@ _st_create_shadow_pipeline_from_actor (StShadow *shadow_spec, cogl_color_init_from_4ub (&clear_color, 0, 0, 0, 0); clutter_actor_get_position (actor, &x, &y); - /* XXX: There's no way to render a ClutterActor to an offscreen - * as it uses the implicit API. */ - G_GNUC_BEGIN_IGNORE_DEPRECATIONS; - cogl_push_framebuffer (fb); - G_GNUC_END_IGNORE_DEPRECATIONS; - cogl_framebuffer_clear (fb, COGL_BUFFER_BIT_COLOR, &clear_color); cogl_framebuffer_translate (fb, -x, -y, 0); cogl_framebuffer_orthographic (fb, 0, 0, width, height, 0, 1.0); @@ -507,10 +501,6 @@ _st_create_shadow_pipeline_from_actor (StShadow *shadow_spec, clutter_actor_paint (actor, paint_context); clutter_paint_context_destroy (paint_context); - G_GNUC_BEGIN_IGNORE_DEPRECATIONS; - cogl_pop_framebuffer (); - G_GNUC_END_IGNORE_DEPRECATIONS; - clutter_actor_set_opacity_override (actor, -1); cogl_object_unref (fb); diff --git a/src/st/st-widget.c b/src/st/st-widget.c index dd11f8ad1..26eccee1f 100644 --- a/src/st/st-widget.c +++ b/src/st/st-widget.c @@ -416,7 +416,7 @@ st_widget_paint_background (StWidget *widget, if (!st_widget_get_resource_scale (widget, &resource_scale)) return; - framebuffer = cogl_get_draw_framebuffer (); + framebuffer = clutter_paint_context_get_framebuffer (paint_context); theme_node = st_widget_get_theme_node (widget); clutter_actor_get_allocation_box (CLUTTER_ACTOR (widget), &allocation); diff --git a/tests/interactive/background-size.js b/tests/interactive/background-size.js index 7b18f8950..064bc9e86 100644 --- a/tests/interactive/background-size.js +++ b/tests/interactive/background-size.js @@ -2,11 +2,13 @@ const UI = imports.testcommon.ui; -const { Cogl, Clutter, St } = imports.gi; +const { Cogl, Clutter, Meta, St } = imports.gi; function test() { - let stage = new Clutter.Stage({ user_resizable: true, width: 1024, height: 768 }); + Meta.init(); + + let stage = Meta.get_backend().get_stage(); UI.init(stage); let vbox = new St.BoxLayout({ style: 'background: #ffee88;' }); @@ -33,20 +35,32 @@ function test() { if (useCairo) obin.style = 'border: 3px solid green;'; else - obin.connect_after('paint', actor => { - Cogl.set_source_color4f(0, 1, 0, 1); + obin.connect_after('paint', (actor, paintContext) => { + let framebuffer = paintContext.get_framebuffer(); + let coglContext = framebuffer.get_context(); + + let pipeline = new Cogl.Pipeline(coglContext); + pipeline.set_color4f(0, 1, 0, 1); let alloc = actor.get_allocation_box(); let width = 3; // clockwise order - Cogl.rectangle(0, 0, alloc.get_width(), width); - Cogl.rectangle(alloc.get_width() - width, width, - alloc.get_width(), alloc.get_height()); - Cogl.rectangle(0, alloc.get_height(), - alloc.get_width() - width, alloc.get_height() - width); - Cogl.rectangle(0, alloc.get_height() - width, - width, width); + framebuffer.draw_rectangle(pipeline, + 0, 0, alloc.get_width(), width); + framebuffer.draw_rectangle(pipeline, + alloc.get_width() - width, width, + alloc.get_width(), alloc.get_height()); + framebuffer.draw_rectangle(pipeline, + 0, + alloc.get_height(), + alloc.get_width() - width, + alloc.get_height() - width); + framebuffer.draw_rectangle(pipeline, + 0, + alloc.get_height() - width, + width, + width); }); tbox.add(obin);